package com.zenithmind.mall.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.SeckillProductDTO;
import com.zenithmind.mall.pojo.query.SeckillProductQuery;
import com.zenithmind.mall.pojo.vo.SeckillProductVO;

import java.util.List;

/**
 * 秒杀商品服务接口 - 遵循接口隔离原则，专门负责秒杀商品管理
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface SeckillProductService {

    /**
     * 分页查询秒杀商品
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<SeckillProductVO> getSeckillProductPage(SeckillProductQuery query);

    /**
     * 根据ID获取秒杀商品详情
     * 
     * @param id 秒杀商品ID
     * @return 商品详情
     */
    SeckillProductVO getSeckillProductById(String id);

    /**
     * 根据活动ID获取秒杀商品列表
     * 
     * @param activityId 活动ID
     * @return 秒杀商品列表
     */
    List<SeckillProductVO> getSeckillProductsByActivity(String activityId);

    /**
     * 添加秒杀商品
     * 
     * @param seckillProductDTO 秒杀商品信息
     * @return 秒杀商品ID
     */
    String addSeckillProduct(SeckillProductDTO seckillProductDTO);

    /**
     * 更新秒杀商品
     * 
     * @param id 秒杀商品ID
     * @param seckillProductDTO 秒杀商品信息
     * @return 是否成功
     */
    Boolean updateSeckillProduct(String id, SeckillProductDTO seckillProductDTO);

    /**
     * 删除秒杀商品
     * 
     * @param id 秒杀商品ID
     * @return 是否成功
     */
    Boolean deleteSeckillProduct(String id);

    /**
     * 批量添加秒杀商品
     * 
     * @param activityId 活动ID
     * @param seckillProductDTOs 秒杀商品信息列表
     * @return 是否成功
     */
    Boolean batchAddSeckillProducts(String activityId, List<SeckillProductDTO> seckillProductDTOs);

    /**
     * 启用/禁用秒杀商品
     * 
     * @param id 秒杀商品ID
     * @param enabled 是否启用
     * @return 是否成功
     */
    Boolean updateSeckillProductStatus(String id, Boolean enabled);

    /**
     * 开始秒杀商品
     * 
     * @param id 秒杀商品ID
     * @return 是否成功
     */
    Boolean startSeckillProduct(String id);

    /**
     * 结束秒杀商品
     * 
     * @param id 秒杀商品ID
     * @return 是否成功
     */
    Boolean endSeckillProduct(String id);

    /**
     * 检查秒杀商品是否可以购买
     * 
     * @param id 秒杀商品ID
     * @param quantity 购买数量
     * @return 是否可以购买
     */
    Boolean canBuy(String id, Integer quantity);

    /**
     * 检查用户是否可以购买秒杀商品
     * 
     * @param id 秒杀商品ID
     * @param userId 用户ID
     * @param quantity 购买数量
     * @return 是否可以购买
     */
    Boolean canUserBuy(String id, String userId, Integer quantity);

    /**
     * 获取用户已购买数量
     * 
     * @param id 秒杀商品ID
     * @param userId 用户ID
     * @return 已购买数量
     */
    Integer getUserBoughtCount(String id, String userId);

    /**
     * 获取热门秒杀商品
     * 
     * @param limit 限制数量
     * @return 热门秒杀商品列表
     */
    List<SeckillProductVO> getHotSeckillProducts(Integer limit);

    /**
     * 获取即将开始的秒杀商品
     * 
     * @param limit 限制数量
     * @return 即将开始的秒杀商品列表
     */
    List<SeckillProductVO> getUpcomingSeckillProducts(Integer limit);

    /**
     * 预热秒杀商品（提前加载到缓存）
     * 
     * @param id 秒杀商品ID
     * @return 是否成功
     */
    Boolean warmUpSeckillProduct(String id);

    /**
     * 批量预热秒杀商品
     * 
     * @param activityId 活动ID
     * @return 是否成功
     */
    Boolean batchWarmUpSeckillProducts(String activityId);

    /**
     * 批量处理秒杀商品状态
     * 
     * @return 处理数量
     */
    Integer batchUpdateSeckillProductStatus();
}
